#include "speechManager.h"
#include "Speaker.h"




SpeechManager::SpeechManager()
{
	this->InitSpeech();

	this->CreateSpeaker();

	this->LoadRecord();
}

void SpeechManager::Show_Menu()
{
	cout << "**********************************************" << endl;
	cout << "************** 欢迎参加演讲比赛 **************" << endl;
	cout << "************** 1. 开始演讲比赛  **************" << endl;
	cout << "************** 2. 查看往届记录  **************" << endl;
	cout << "************** 3. 清空比赛记录  **************" << endl;
	cout << "************** 0. 退出比赛程序  **************" << endl;
	cout << "**********************************************" << endl;
	cout << endl;
}

void SpeechManager::ExitSystem()
{
	cout << "欢迎下次使用。" << endl;
	system("pause");
	exit(0);
}

void SpeechManager::InitSpeech()
{
	this->v1.clear();
	this->v2.clear();
	this->victory.clear();
	this->m_Speaker.clear();
	this->m_Index = 1;

	this->m_Record.clear();
}

void SpeechManager::CreateSpeaker()
{
	string nameSeed = "ABCDEFGHIJKL";
	for (int i = 0; i < nameSeed.size(); i++)
	{
		string name = "选手";
		name += nameSeed[i];

		Speaker sp;
		sp.m_Name = name;
		for (int j = 0; j < 2; j++)
		{
			sp.m_Score[j] = 1.0 * 0;
		}

		this->v1.push_back(i + 10001);

		this->m_Speaker.insert(pair<int, Speaker>(i + 10001, sp));
	}
}

void SpeechManager::SpeechDraw()
{
	cout << "第" << this->m_Index << "轮比赛选手正在抽签......" << endl;
	cout << "--------------------------------------" << endl;
	Sleep(1000);
	cout << "抽签结果如下: " << endl;
	if (this->m_Index == 1)
	{
		random_shuffle(v1.begin(), v1.end());
		for (vector<int>::iterator it = v1.begin(); it != v1.end(); it++)
		{
			cout << *it << " ";
		}
		cout << endl;
	}
	else
	{
		random_shuffle(v2.begin(), v2.end());
		for (vector<int>::iterator it = v2.begin(); it != v2.end(); it++)
		{
			cout << *it << " ";
		}
		cout << endl;
	}
	cout << "--------------------------------------" << endl;
	system("pause");
	cout << endl;
}

void SpeechManager::SpeechContest()
{	
	cout << "-----------------第" << this->m_Index << "轮正式比赛开始-----------------" << endl;
	multimap<double, int, greater<double> > groupScore;
	
	int num = 0;	//记录人员数，6个为1组
	
	vector<int> v_Src;	//比赛的人员容器
	if (this->m_Index == 1)
		v_Src = v1;
	else
		v_Src = v2;

	for (vector<int>::iterator it = v_Src.begin(); it != v_Src.end(); it++)
	{
		num++;

		//评委打分
		deque<double>d;
		for (int i = 0; i < 10; i++)	//10个评委
		{
			//600-1000再 /10.f 得到60-100的小数
			double score = (rand() % 401 + 600) / 10.f; 
			//cout << score << "\t";
			d.push_back(score);
		}
		//cout << endl;
		sort(d.begin(), d.end(), greater<double>());
		d.pop_front();
		d.pop_back();

		double sum = accumulate(d.begin(), d.end(), 0.0f);	//0.0f是起始累加值，一个小数
		double avg = sum / (double)d.size();

		//打印平均分
		//cout << "编号: " << *it << "\t姓名: " << this->m_Speaker[*it].m_Name <<
		//	"\t获取平均分为: " << avg << endl;

		this->m_Speaker[*it].m_Score[this->m_Index - 1] = avg;

		groupScore.insert(pair<double, int>(avg, *it));	//得分和编号
		if (num % 6 == 0)
		{
			cout << "第" << num/6 << "小组比赛名次: " << endl;
			for (multimap<double, int, greater<double> >::iterator it = groupScore.begin(); it != groupScore.end(); it++)
			{
				cout << "编号: " << it->second << "\t姓名: " << this->m_Speaker[it->second].m_Name <<
					"\t成绩: " << this->m_Speaker[it->second].m_Score[this->m_Index - 1] << endl;

			}

			//前三名晋级
			int cnt = 0;
			for (multimap<double, int, greater<double> >::iterator it = groupScore.begin(); cnt<3&&it != groupScore.end(); cnt++, it++)
			{
				if (this->m_Index == 1)
				{
					v2.push_back(it->second);
				}
				else
				{
					victory.push_back(it->second);
				}
			}
			groupScore.clear();
			cout << endl;
		}
	}
	cout << "-------------------第" << this->m_Index << "轮比赛结束-------------------" << endl;;
}

void SpeechManager::ShowScore()
{
	cout << "---------------第" << this->m_Index << "轮晋级选手信息如下:---------------" << endl;
	vector<int> v;
	if (this->m_Index == 1)
		v = v2;
	else
		v = victory;

	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << "选手编号: " << *it << "\t姓名" << m_Speaker[*it].m_Name <<
			"\t得分: " << m_Speaker[*it].m_Score[this->m_Index - 1] << endl;
	}
	cout << endl;
	system("pause");
	system("cls");
	this->Show_Menu();
}

void SpeechManager::SaveRecord()
{
	ofstream ofs;
	ofs.open("speech.csv", ios::out | ios::app);

	for (vector<int>::iterator it = victory.begin(); it != victory.end(); it++)
	{
		ofs << *it << "," << m_Speaker[*it].m_Score[1] << ",";
	}
	ofs << endl;

	ofs.close();
	cout << "记录已经保存。" << endl;
	this->fileIsEmpty = false;
}

void SpeechManager::StartSpeech()
{
	//第一轮比赛
	//1.抽签
	this->SpeechDraw();

	//2.比赛
	this->SpeechContest();

	//3.显示晋级结果
	this->ShowScore();

	//第二轮比赛
	this->m_Index++;
	//1.抽签
	this->SpeechDraw();
	//2.比赛
	this->SpeechContest();
	//3.显示晋级结果
	this->ShowScore();
	//保存
	this->SaveRecord();

	this->InitSpeech();

	this->CreateSpeaker();

	this->LoadRecord();


	cout << "本届比赛完毕！" << endl;
	system("pause");
	system("cls");
}

void SpeechManager::LoadRecord()
{
	ifstream ifs("speech.csv", ios::in);

	if (!ifs.is_open())
	{
		this->fileIsEmpty = true;
		//cout << "文件不存在!" << endl;
		ifs.close();
		return;
	}

	char ch;
	ifs >> ch;
	if (ifs.eof())
	{
		//cout << "文件为空！" << endl;
		this->fileIsEmpty = true;
		ifs.close();
		return;
	}

	//文件不为空
	this->fileIsEmpty = false;

	ifs.putback(ch);	//将读取的单个字符放回去

	string data;
	int idx = 0;
	while (ifs >> data)
	{
		vector<string> v;

		int pos = -1;
		int start = 0;
		while (true)
		{
			pos = data.find(",", start);
			if (pos == -1)
			{ 
				break;
			}
			string tmp = data.substr(start, pos - start);	//字符串分割
										//参数1起始位置， 参数2是截取长度
			v.push_back(tmp);
			start = pos + 1;
		}
		this->m_Record.insert(make_pair(idx, v));
		idx++;
	}
	ifs.close();
}

void SpeechManager::ShowRecord()
{
	if (this->fileIsEmpty)
	{
		cout << "文件为空或文件不存在。" << endl;
	}

	for (int i = 0; i < this->m_Record.size(); i++)
	{
		cout << "第" << i + 1 << "届:" <<endl <<
			"冠军编号: " << this->m_Record[i][0] << "\t得分: " << this->m_Record[i][1] << endl <<
			"亚军编号: " << this->m_Record[i][2] << "\t得分: " << this->m_Record[i][3] << endl <<
			"季军编号: " << this->m_Record[i][4] << "\t得分: " << this->m_Record[i][5] << endl;
		cout << endl;
	}
	cout << endl;
	system("pause");
	system("cls");
}

void SpeechManager::clearRecord()
{
	cout << "确认清空?" << endl;
	cout << "1.确认" << endl;
	cout << "2.返回" << endl;

	int select = 0;
	cin >> select;
	if (select == 1)
	{
		ofstream ofs("speech.csv", ios::trunc);
		ofs.close();

		this->InitSpeech();
		this->CreateSpeaker();
		this->LoadRecord();
		cout << "清空成功！" << endl;
	}
	else if (select == 2)
	{

	}
	else
	{
		cout << "输入错误。" << endl;
	}
	system("pause");
	system("cls");

}

SpeechManager::~SpeechManager()
{

}



